package com.burst.reptile.common.utils.file;

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.imageio.ImageIO;

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;

/**
 * 视频工具类
 * 
 * @author wujin
 *
 * @date: 2020-8-20 13:30:18
 */
public class VideoUtils {

//	/**
//	 * 截取视频指定帧生成gif
//	 *
//	 * @param videofile  视频文件
//	 * @param startFrame 开始帧
//	 * @param frameCount 截取帧数
//	 * @param frameRate  帧频率（默认：3）
//	 * @param margin     每截取一次跳过多少帧（默认：3）
//	 * @throws java.io.IOException 截取的长度超过视频长度
//	 */
//	public static void buildGif(String videofile, int startFrame, int frameCount, Integer frameRate, Integer margin)
//			throws IOException {
//		if (margin == null) {
//			margin = 3;
//		}
//		if (frameRate == null) {
//			frameRate = 3;
//		}
//		FileOutputStream targetFile = new FileOutputStream(videofile.substring(0, videofile.lastIndexOf(".")) + ".gif");
//		FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
//		Java2DFrameConverter converter = new Java2DFrameConverter();
//		ff.start();
//		try {
//			if (startFrame > ff.getLengthInFrames() && (startFrame + frameCount) > ff.getLengthInFrames()) {
//				throw new CustomException("视频太短了!");
//			}
//			ff.setFrameNumber(startFrame);
//			AnimatedGifEncoder en = new AnimatedGifEncoder();
//			en.setFrameRate(frameRate);
//			en.start(targetFile);
//			for (int i = 0; i < frameCount; i++) {
//				en.addFrame(converter.convert(ff.grabImage()));
//				ff.setFrameNumber(ff.getFrameNumber() + margin);
//			}
//			en.finish();
//		} finally {
//			ff.stop();
//			ff.close();
//			targetFile.close();
//		}
//	}

	/**
	 * 将图片旋转指定度
	 *
	 * @param bufferedimage 图片
	 * @param degree        旋转角度
	 * @return
	 */
	public static BufferedImage rotateImage(BufferedImage bufferedimage, int degree) {
		// 得到图片宽度。
		int w = bufferedimage.getWidth();
		// 得到图片高度。
		int h = bufferedimage.getHeight();
		// 得到图片透明度。
		int type = bufferedimage.getColorModel().getTransparency();
		// 空的图片。
		BufferedImage img;
		// 空的画笔。
		Graphics2D graphics2d;
		(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics())
				.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		// 旋转，degree是整型，度数，比如垂直90度。
		graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);
		// 从bufferedimagecopy图片至img，0,0是img的坐标。
		graphics2d.drawImage(bufferedimage, 0, 0, null);
		graphics2d.dispose();
		// 返回复制好的图片，原图片依然没有变，没有旋转，下次还可以使用。
		return img;
	}

	/**
	 * 截取视频指定帧保存为指定格式的图片（图片保存在视频同文件夹下）
	 *
	 * @param videofile  视频地址
	 * @param imgSuffix  图片格式
	 * @param indexFrame 第几帧（默认：5）
	 * @throws Exception
	 */
	public static void fetchFrame(String videofile, String imgSuffix, Integer indexFrame) throws Exception {
		if (indexFrame == null) {
			indexFrame = 5;
		}
		Integer suffixIndex = videofile.lastIndexOf(".");
		File targetFile = new File((suffixIndex != -1 ? videofile.substring(0, suffixIndex) : videofile) + imgSuffix);

		try (FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
				OutputStream outputStream = new FileOutputStream(targetFile)) {
			ff.start();
			ff.setFrameNumber(indexFrame);
			Frame f = ff.grabImage();
			Java2DFrameConverter converter = new Java2DFrameConverter();
			BufferedImage fecthedImage = converter.getBufferedImage(f);
			ImageIO.write(fecthedImage, "jpg", outputStream);
		}
	}
	
	/**
	 * 截取视频指定帧保存为指定格式的图片（图片保存在视频同文件夹下）
	 *
	 * @param videofile  视频地址 http
	 * @param imgPath  图片存储位置
	 * @param indexFrame 第几帧（默认：5）
	 * @throws Exception
	 */
	public static void fetchFrameUrl(String videofile, String imgPath, Integer indexFrame) throws Exception {
		if (indexFrame == null) {
			indexFrame = 5;
		}
		File targetFile = new File(imgPath);
		FFmpegFrameGrabber ff = null;
		OutputStream outputStream = null;
		InputStream is =null;
		URL url = null;
		try {
			url = new URL(videofile);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();//利用HttpURLConnection对象,我们可以从网络中获取网页数据.
			conn.setDoInput(true);
			conn.connect();
			is = conn.getInputStream();	//得到网络返回的输入流
			ff = new FFmpegFrameGrabber(is);
			outputStream = new FileOutputStream(targetFile);
			ff.start();
			ff.setFrameNumber(indexFrame);
			Frame f = ff.grabImage();
			
			Java2DFrameConverter converter = new Java2DFrameConverter();
			BufferedImage fecthedImage = converter.getBufferedImage(f);
			ImageIO.write(fecthedImage, "jpg", outputStream);
		} finally {
			if(outputStream != null) {
				outputStream.close();
			}
			if(ff != null) {
				ff.close();
			}
		}
		
	}

	public static void main(String[] args) {
		try {
//			buildGif("D:/图片素材/sdxl.mp4", 50, 10, 16, 10);
//			Thread.sleep(1000);
//			Img.from(FileUtil.file("‪D:/图片素材/1111.gif"))
//		    .setQuality(0.5)//压缩比率
//		    .write(FileUtil.file("D:/图片素材/1212111.gif"));
			fetchFrameUrl("https://sxp-1259003793.cos.ap-chongqing.myqcloud.com/video/8ca0f136af644ddb99aa0a2256141882.mp4", "D:/图片素材/1212111.jpg", 2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
